import {message, Modal} from 'antd';
import keyCodes from '@/keyCodes';
import { setLocale } from 'umi-plugin-locale';
import history from 'umi/router';
import {getOS, getStorage, removeStorage, setStorage} from 'jh-utils';
import * as localUtils from '@/utils/localeUtils';
import './global.less'
import {isFunction} from "lodash-es";
import {STORAGE_KEY} from "@/globalConfig";
import {getRequest} from "jh-utils";
import {isLoginPage} from "@/utils/storage";
import * as requestObj from "@/utils/request";
import tipConfig from '@/tipConfig';

const {myFormatMessage} = localUtils;

message.config({
  top: 100,
  duration: 2,
  maxCount: 1,
});

window.localUtils = localUtils;
// 将 服务端的请求 方法放到当前 window 中，使得在任何地方都可以 发起服务端请求
window.requestObj = requestObj;
window.tipConfig = tipConfig;

window.setLocale = setLocale;

window.isPc = getOS && (getOS()).isPc;

window.openWin = function () {
  let newWin = window.open(...arguments);

  if (!newWin || newWin.closed || typeof newWin.closed == 'undefined') {
    // '本站弹出窗口被屏蔽，如需查看请修改浏览器相关配置!'
    message.error(myFormatMessage('tip.window.open'));
  }
  return newWin;
};

/**
 * 登陆之后的方法。目前用于 父级应用 在登录之后调用，将 父级应用 的登录状态同步过来
 */
window.dealAfterLogin = function(rsp) {
  // 在这里写 “同步 父级应用 登录状态” 的逻辑
  console.info('[afc] window.dealAfterLogin rsp', rsp);

  if (isFunction(window.dvaDispatch)) {

    window.dvaDispatch({
      type: 'global/afterLogin',
      payload: { rsp },
    });
  }
};

/**
 * 处理登录过期之后的逻辑。
 * ① 当检查到登录过期，会在 request.ts 的 isLogin 中调用，弹出登录过期提示，随后弹出登录弹框;
 * ② 另外，当在 iframe 子应用登录过期，要调用父级应用的这个方法，让父级应用重新登录。
 * 也就是在 request.ts 的 isLogin 中调用 window.parent.dealLoginTimeout()
 */
window.dealLoginTimeout = function () {
  // 如果当前应用是在 iframe 中，要调用父级应用的 dealLoginTimeout 方法，让父级应用重新登录。
  if (window.isIframe && window.parent.dealLoginTimeout) {
    window.parent.dealLoginTimeout();
    return;
  }

  let isShowingTimeout = getStorage(STORAGE_KEY.SHOWING_TIMEOUT); // 用于避免多次弹出“登录过期”弹框

  if (1 != isShowingTimeout && (
    -1 === window.location.href.indexOf('/user/') ||
    -1 === window.location.href.indexOf('/login')
  )) {
    // 注销之后，清空当前系统用户数据和缓存
    if (isFunction(window.dvaDispatch)) {
      window.dvaDispatch({
        type: 'global/afterLogout'
      });
    }

    // 缓存当前页面路由，由于项目用的是 hash 路由，所以就直接截取了页面 URL 的 hash 部分
    setStorage(STORAGE_KEY.TIMEOUT_ROUTE, window.location.hash.substr(1));
    // 标识已经弹出“登录过期提示框”，避免重复弹出
    setStorage(STORAGE_KEY.SHOWING_TIMEOUT, 1);
    // hadWarn = 1;
    Modal.warning({
      title: myFormatMessage('global.login.timeout'),
      content: myFormatMessage('global.login.timeout.tip'),
      maskClosable: false,
      keyboard: false,
      // centered: true,
      zIndex: 99999,
      onOk: () => {
        // 通过 `window.dvaDispatch(action)` 弹出 [登录页的 `iframe` 弹框] ，等待重新登录
        if (isFunction(window.dvaDispatch)) {
          window.dvaDispatch({
            type: 'global/setStateByPayload',
            payload: {
              loginTimeout: true
            },
          });
        } else {
          removeStorage(STORAGE_KEY.SHOWING_TIMEOUT);
          history.replace('/login');
        }
      },
    });
  }
};

// 标识是不是在 “iframe"里面
if (getRequest && '1' == getRequest('isIframe')) {
  window.isIframe = true;

  // 如果是登录页在iframe中，则调整 html 的最小宽度，避免登录弹框的样式问题
  if (isLoginPage()) {
    document.getElementsByTagName('html')[0].style.minWidth = 'auto';
  }
}

// let isLoginIframe = 'LOGIN' === getStorage(STORAGE_KEY.IFRAME_LOGIN);
// if (isLoginIframe) {
//   // 如果是登录页在iframe中，则调整 html 的最小宽度，避免登录弹框的样式问题
//   document.getElementsByTagName('html')[0].style.minWidth = 'auto';
// }

document.body.onclick = (e) => {
  let tar = e.target;

  if (tar && /(INPUT|TEXTAREA)/.test(tar.tagName) && tar.select) {
    tar.select();
  }
};

let refleshConfirm = null;

document.body.onkeydown = function (e) {
  let keyCode = e.code || e.keyCode || e.which || e.charCode;
  let tar = e.target;

  // 禁止浏览器默认的 backspace 历史返回操作;
  if (keyCodes.backspace === keyCode && e.target && !(/(INPUT|TEXTAREA)/.test(tar.tagName))) {
    e.preventDefault();
  }
  // 在输入框时，禁止浏览器的 F5 刷新
  if (keyCodes.f5 === keyCode) {
    e.preventDefault();
    if (null === refleshConfirm &&
      e.target && !(/(INPUT|TEXTAREA)/.test(tar.tagName))
      && /(Add|detail|acctSettle)/.test(window.location.href)) {
      refleshConfirm = Modal.confirm({
        title: myFormatMessage('global.reload.title'),
        content: myFormatMessage('global.reload.tip'),
        centered: true,
        onOk() {
          refleshConfirm = null;
          window.location.reload();
        },
        onCancel() {
          refleshConfirm = null;
        },
      });
    }
  }
};



/// 获取各子项目的版本信息
window.JH_VERSION = getStorage(STORAGE_KEY.JH_VERSION) || {};
requestObj.reqGet('/3rd/config/version.json', { v: new Date().getTime() }).then((rsp) => {
  // console.log('version.json', rsp);
  window.JH_VERSION = rsp || {};
  setStorage(STORAGE_KEY.JH_VERSION, window.JH_VERSION);
});
